package com.example.mysql.学习笔记.高级.数据库的优化之索引.索引的数据结构;

/**
 * 索引介绍
 * 索引是存储弓|擎用于快速找到数据记录的一-种数据结构,
 * 进行数据查找时，首先查看查询条件是否命中某条索引，
 * 符合则通过索引查找相关数据，
 * 如果不符合则需要全表扫描，即需要一条- 条地查找记录
 * 直到找到与条件符合的记录。
 *
 * 索引，目的就是为了减少"磁盘"I/0的次數，加快查询速率。
 *
 * 索引的本质:索引是数据结构。你可以简单理解为“排好序的快速查找数据结构”，
 * 满足特定查找算法。这些数据结构以某种方式指向数据，
 * 这样就可以在这些数据结构的基础.上实现高级查找算法。
 * 索引是在存储引擎中实现的，因此每种存储弓|擎的索引不一-定完全相同，
 * 并且每种存储引擎不一定支持所有索引类型。
 * 同时，存储引擎可以定义每个表的最大索引数和最大索引长度。
 * 所有存储引擎支持每个表最多16个索引，
 * 总索引长度至少为256字节。
 * 有些存储引擎支持更多的索引数和更大的索引长度。
 *
 */

/**
 * 索引优点
 * (1)类似大学图书馆建书目索引，提高数据检索的效率,降低数据库的I0成本，
 * 这也是创建索引最主要的原因。
 * (2)通过创建唯一索引， 可以保证数据库表中每一行数据的唯一性。
 * (3)在实现数据的参考完整性方面，可以加速表和表之间的连接。
 * 换句话说，对于有依赖关系的子表和父表联合查询时，可以提高查询速度。
 * (4)在使用分组和排序子句进行数据查询时，
 * 可以显著减少查询中分组和排序的时间,降低了CPU的消耗。
 */

/**
 * 索引缺点   普通索引  和唯一索引  效率其实差不多
 * 增加索引也有许多不利的方面，主要表现在如下几个方面:
 * (1)创建索引和维护索引要耗费时间,并且随着数据量的增加，所耗费的时间也会增加。
 * (2) 索引需要占磁盘空间，除了数据表占数据空间之外,每一个索引|还要占一定的物理空间，
 *  存储在磁盘上,如果有大量的索引，索引文件就可能比数据文件更快达到最大文件尺寸。
 * (3)虽然索引大大提高了查询速度,同时却会降低更新表的速度。
 *  当对表中的数据进行增加、删除和修改的时候，
 *  索引也要动态地维护,这样就降低了数据的维护速度。
 *
 *  提示:
 *  索引可以提高查询的速度，但是会影响插入记录的速度。
 *  这种情况下，最好的办法是先删除表中的索引，然后插入数据，插入完成后再创建索引。
 *
 *  索引是个好东西，可不能乱建，它在空间和时间上都会有消耗:
 * ●空间上的代价
 * 每建立--个索引都要为它建立一棵B+树,每一棵B+树的每一个节 点都是一个数据页,
 * 一个页默认会占用16KB的存储空间，一棵很大的B+树由许多数据页组成,那就是很大的一片存储空间。
 * ●时间上的代价
 * 每次对表中的数据进行增、删、改操作时，都需要去修改各个B+树索引。
 * 而且我们讲过, B+树每层节点都是按照索引列的值从小到大的顺序排序而组成了双向链表。
 * 不论是叶子节点中的记录，还是内节点中的记录(也就是不论是用户记录还是目录项记录)
 * 都是按照索引列的值从小到大的顺序而形成了一个单向链表。
 * 而增、删、改操作可能会对节点和记录的排序造成破坏，
 * 所以存储引擎需要额外的时间进行一些记录移位，
 * 页面分裂、页面回收 等操作来维护好节点和记录的排序。
 * 如果我们建了许多索引，每个索弓|对应的B+树都要进行相关的维护操作，会给性能拖后腿。
 *
 *
 */
public class 索引 {
}
